/** 
 * @main    Plik naglowkowy klasy symulator - wzorzec obserwatora
 * @file    symulator.h
 * @author  Tomasz Wierzchowski
 *
 */


#ifndef _SYMULATOR_H
#define	_SYMULATOR_H

//#include <list>
#include "symulacja.h"
#include "obiektobserwowalny.h"
#include "obserwator.h"
#include <cliext/map>
#include <cliext/vector>
#include <cliext/list>
#include "armax.h"


using namespace System::Threading;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++ POCZ�TEK [Symulator] +++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
 * 
 */

//std::vector<ObiektDyskretny *> wektorDyskr;

   
ref class Symulator  : public ObiektObserwowalny {
   private:
   cliext::map<System::String^, int> mapaRegulatorow;
   cliext::map<System::String^, int> mapaObiektow;
   cliext::map<System::String^, int> mapaPustychGeneratorow;
   cliext::vector<System::String^> wektorDodanychGeneratorow;
   Thread^ watekSymulacji;
   cliext::list<Obserwator^> listaObserwatorow;
   PetlaSymulacji *petla;
   int czasProbkowania;
   int nrProbki;
   double u, y, w, czas;
   bool obiektUstawiony;
   delegate System::Void nowyStan_d (int stan);
   System::Void petlaSymulacji();
   void aktualizacjaListyGeneratorowSymulatora();
   cliext::vector<double> tablicaWartosci;
   System::Windows::Forms::Form^ parent;
   

   static std::string ToStdString(System::String^ source) {
      std::string result;
      int len = source->Length;
      for (int i=0; i<len; i++)
	 result += (char)source[i];
      return result;
   }
      
   static System::String^ ToSysString(std::string source) {
      System::String^ result;
      int len = (int)source.length();
      for (int i=0; i<len; i++)
	 result += (wchar_t)source[i];
      return result;
   }
      
   public:
   Symulator(System::Windows::Forms::Form^);
   ~Symulator();
   
   virtual void dodajObserwatora(Obserwator^);
   virtual void usunObserwatora(Obserwator^);
   virtual void nowyStan(int);
   void wczytajKonfiguracje();

   void symulatorStart();
   void symulatorStop();
   void symulatorReset();

   cliext::map<System::String^,int> pobierzMapeRegulatorow();
   cliext::map<System::String^,int> pobierzMapeObiektow();
   cliext::map<System::String^,int> pobierzMapeWartZad();
   cliext::vector<System::String^> pobierzListeUstawionychGeneratorow();

   void ustawRegulator(System::String^);
   void ustawObiekt(System::String^);
   void dodajWartZad(System::String^);
   void usunWartZad(System::String^);

   std::map<std::string, std::string> pobierzKonfigRegulatora();
   std::map<std::string, std::string> pobierzKonfigObiektu();
   std::map<std::string, std::string> pobierzKonfigGeneratora(std::string);
   cliext::vector<double> pobierzAktualneWartosci();
   void ustawCzasProbkowania(int);

   void zmienParametryRegulatora(std::map<std::string,std::string>);
   void zmienParametryGeneratora(std::string, std::map<std::string,std::string>);
};


#endif	/* _SYMULATOR_H */
